(function() {
  // xml解析工具
  const xmldoc = require('xmldoc');


  // 邮箱正则表达式
  const emailReg = /^([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$/;
  // 手机号正则表达式
  const mobileReg = /^(13[0-9]|14[0-9]|15[0-9]|17[0-9]|18[0-9])\d{8}$/;
  //身份证正则表达式(15位)
  const isIDCard1 = /^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$/;
  //身份证正则表达式(18位)
  const isIDCard2 = /^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{4}$/;
  // 加权因子
  var Wi = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1];
  // 身份证验证位值.10代表X
  var ValideCode = [1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2];
  // 身份证省份编码
  var city = { 11: '北京', 12: '天津', 13: '河北', 14: '山西', 15: '内蒙古', 21: '辽宁', 22: '吉林', 23: '黑龙江 ', 31: '上海', 32: '江苏', 33: '浙江', 34: '安徽', 35: '福建', 36: '江西', 37: '山东', 41: '河南', 42: '湖北 ', 43: '湖南', 44: '广东', 45: '广西', 46: '海南', 50: '重庆', 51: '四川', 52: '贵州', 53: '云南', 54: '西藏 ', 61: '陕西', 62: '甘肃', 63: '青海', 64: '宁夏', 65: '新疆', 71: '台湾', 81: '香港', 82: '澳门', 91: '国外 ' };
  //18位身份证需要验证最后一位校验位
  function isTrueValidateCodeBy18IdCard(code) {
    var flag = true;
    code = code.split('');
    var sum = 0;
    var ai = 0;
    var wi = 0;
    for (var i = 0; i < 17; i++) {
      ai = code[i];
      wi = Wi[i];
      sum += ai * wi;
    };
    ValideCode[sum % 11] == code[17] ? flag = true : flag = false;
    return flag;
  };

  module.exports = {
    testEmail: email => {
      var flag = true;
      (!emailReg.test(email)) ? flag = false: flag = true;
      return flag;
    },
    testMobile: mobile => {
      var flag = true;
      (!mobileReg.test(mobile)) ? flag = false: flag = true;
      return flag;
    },
    testID: idNumber => {
      idNumber = idNumber + '';
      var flag = true;
      city[idNumber.substr(0, 2)] ? flag = true : flag = false;
      (isIDCard1.test(idNumber)) ? flag = true: flag = false;
      (isIDCard2.test(idNumber)) && isTrueValidateCodeBy18IdCard(idNumber) ? flag = true : flag = false;
      return flag;
    },
    // 将微信消息的xml文本转为json
    xml2json: xmlString => {
      printData('正在处理xml数据转json：', xmlString);
      // var xml = '<xml><ToUserName><![CDATA[gh_5e43d48e109a]]></ToUserName>'
      //     + '<FromUserName><![CDATA[o_QrEjqg8XXflyRUw5hnoxf6ol6w]]></FromUserName>'
      //     + '<CreateTime>1464621967</CreateTime>'
      //     + '<MsgType><![CDATA[text]]></MsgType>'
      //     + '<Content><![CDATA[莫]]></Content>'
      //     + '<MsgId>6290503449708695373</MsgId>'
      //     + '</xml>';
      var doc = new xmldoc.XmlDocument(xmlString);
      var json = {};
      doc.eachChild((child, index, array) => {
        json[child.name] = child.val;
      });
      printSuccess('xml2json转换完成：', json);
      return json;
    },
    json2xml: jsonDoc => {
      printData('正在处理json数据转xml：', jsonDoc);
      var temp = jsonDoc.ToUserName;
      jsonDoc.ToUserName = jsonDoc.FromUserName;
      jsonDoc.FromUserName = temp;
      jsonDoc.Content = '我们正在努力完善升级中，不久将带来全新功能体验，敬请期待';
      var xmlString = '<xml>' +
        '<CreateTime>' + Math.ceil((new Date()).getTime() / 1000) + '</CreateTime>';
      for (key in jsonDoc) {
        xmlString += '<' + key + '><![CDATA[' + jsonDoc[key] + ']]></' + key + '>';
      };
      xmlString += '</xml>';
      printSuccess('json2xml转换完成：', xmlString);
      return xmlString;
      // return new xmldoc.XmlDocument(xmlString);
    },
    // 向微信请求数据
    responseFromWX: co.wrap(function*(url, method, xmlString, contentType) {
      var result = yield fetch(url, {
        method: method,
        headers: {
          'Content-Type': contentType || 'text/xml'
        },
        body: xmlString
      }).then(function(response, err, msg) {
        var buffer = response.body._readableState.buffer;
        var str = buffer.toString('utf-8', 0);
        return str;
      });
      return result;
    }),
    // 随机生成字符串
    randomString: (len) => {
      len = len || 32;
      var $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890';
      // var $chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678';    /****默认去掉了容易混淆的字符oOLl,9gq,Vv,Uu,I1****/
      var maxPos = $chars.length;
      var str = '';
      for (i = 0; i < len; i++) {
        str += $chars.charAt(Math.floor(Math.random() * maxPos));
      };
      return str;
    }
  };
}());
